/**
 * 针对 egret.DisplayObject 及其子类的工具
 * */

const colorMatrix = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]
const groupAlphaCache = new Map()
/**
 * 让内含多个元素的组合元素集合体调整透明度
 *
 * 如果只是简单的设置这种集合体的 alpha 属性，它会遍历所有子元素把它们的透明度设为指定值，展示出来的效果和修改一个整体透明度是不一样的。
 * @param obj
 * @param alpha 从0到1
 * */
export function groupAlpha(obj: egret.DisplayObject, alpha: number) {
  const cache = groupAlphaCache.get(obj) || {
    alpha: 1,
    colorMatrix: [...colorMatrix],
    colorMatrixFilter: undefined,
  }
  if (cache.alpha === alpha) {
    return
  }
  if (alpha === 1) {
    cache.alpha = alpha
    obj.filters = null
    return
  }
  cache.alpha = alpha
  cache.colorMatrix[18] = alpha
  if (!cache.colorMatrixFilter) {
    cache.colorMatrixFilter = new egret.ColorMatrixFilter(cache.colorMatrix)
  } else {
    cache.colorMatrixFilter.matrix = cache.colorMatrix
  }
  obj.filters = [cache.colorMatrixFilter]
  groupAlphaCache.set(obj, cache)
}
